home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / stdwin / Packs / textedit / text.h < prev    next >
Text File  |  1995-12-21  |  4KB  |  128 lines

  1. /* Text Edit, definitions */
  2.  
  3. /* Include header files */
  4. #include "stdwin.h"    /* Window interface */
  5. #include "tools.h"    /* Lots of useful goodies */
  6.  
  7. #ifndef LSC
  8. #define NDEBUG        /* Turn off all debugging code */
  9. #endif
  10.  
  11. #define RESERVE 256    /* Increment for gap growth */
  12. #define STARTINCR 20    /* Increment for start array growth; must be >= 1 */
  13.  
  14. /* Typedefs (for documentation only) */
  15. typedef int focpos;    /* Logical offset (not affected by gap) */
  16. typedef int bufpos;    /* Buffer offset (taking gap into account) */
  17. typedef int lineno;    /* Index into start array */
  18. typedef int coord;    /* Used to declare pairs of coordinates */
  19. typedef coord hcoord;    /* Hor. coordinate */
  20. typedef coord vcoord;    /* Ver. coordinate */
  21.  
  22. struct _textedit {
  23.     /* Drawing environment */
  24.     WINDOW *win;
  25.     coord left, top, right, bottom;        /* Text area */
  26.     hcoord width;    /* == right-left */
  27.     TEXTATTR attr;    /* Text attributes */
  28.     vcoord vspace;    /* Vertical spacing (line height) */
  29.     hcoord tabsize;    /* Spacing of horizontal tabs */
  30.     
  31.     /* Text and focus representation */
  32.     char *buf;    /* Text buffer */
  33.     bufpos buflen;    /* Size of buffer */
  34.     bufpos gap;    /* Start of gap */
  35.     int gaplen;    /* Gap length */
  36.     focpos foc;    /* Text selection focus start */
  37.     int foclen;    /* Focus length */
  38.     bufpos *start;    /* Array of screen line starts */
  39.     lineno nlines;    /* Number of lines */
  40.     lineno nstart;    /* Number of elements of start (must be > nlines) */
  41.     hcoord aim;    /* Where vertical arrows should (try to) go */
  42.     focpos anchor;    /* Anchor position of focus drag */
  43.     focpos anchor2;    /* Other end of anchor */
  44.     tbool focprev;    /* Set if foc between lines belongs to prev line */
  45.     tbool hilite;    /* Set if focus area shown inverted */
  46.     tbool mdown;    /* Set if mouse down */
  47.     tbool dclick;    /* Set if mouse down in double click */
  48.     tbool drawing;    /* FALSE if no window operations */
  49.     tbool active;    /* FALSE to inhibit highlighting and caret */
  50.     
  51.     /* To optimize single char inserts */
  52.     tbool opt_valid;    /* Set if following data is valid */
  53.     tbool opt_in_first_word;/* Focus is in first word of line */
  54.     lineno opt_i;        /* Line where focus is */
  55.     coord opt_h, opt_v;    /* Caret position in window */
  56.     hcoord opt_avail;    /* White pixels at end of line */
  57.     hcoord opt_end;        /* End of line or next tab stop */
  58.  
  59.     /* View restriction */
  60.     coord vleft, vtop, vright, vbottom;    /* View area */
  61.     tbool viewing;                /* TRUE to enable view */
  62.  
  63.     /* NB: aim, opt_h, opt_v are in window coordinates,
  64.            i.e., tp->left or tp->top has already been added */
  65. };
  66.  
  67. /* Constants */
  68. #define UNDEF        (-1)    /* Undefined value, e.g., for aim */
  69.  
  70. /* NB: All macros below use a variable 'tp' pointing to the textedit struct */
  71.  
  72. /* Shorthands */
  73. #define zfocend        (tp->foc+tp->foclen)
  74. #define zgapend        (tp->gap+tp->gaplen)
  75.  
  76. /* Transformations between focpos and bufpos values */
  77. #define zaddgap(f)    ((f) < tp->gap ? (f) : (f)+tp->gaplen)
  78. #define zsubgap(pos)    ((pos) <= tp->gap ? (pos) : \
  79.              (pos) <= zgapend ? tp->gap : (pos)-tp->gaplen)
  80.  
  81. /* ++ and -- operators for bufpos variables */
  82. #define zincr(p)    (++*(p) == tp->gap ? (*(p) += tp->gaplen) : *(p))
  83. #define zdecr(p)    (*(p) == zgapend ? (*(p) = tp->gap - 1) : --*(p))
  84.  
  85. /* +1 and -1 operators for same */
  86. #define znext(p)    ((p) == tp->gap-1 ? zgapend : (p)+1)
  87. #define zprev(p)    ((p) == zgapend ? (tp->gap-1) : (p)-1)
  88.  
  89. /* Access characters at/before positions */
  90. #define zcharat(p)    (tp->buf[p])
  91. #define zcharbefore(p)    (tp->buf[zprev(p)])
  92.  
  93. /* Tab stop calculation */
  94. #define znexttab(w) ((((w)+tp->tabsize) / tp->tabsize) * tp->tabsize)
  95.  
  96. /* Functions that don't return int */
  97. TEXTEDIT *tesetup();
  98. char *zmalloc();
  99. char *zrealloc();
  100.  
  101. /* Debugging help */
  102.  
  103. #ifndef NDEBUG
  104.  
  105. #ifndef __LINE__
  106. #define __LINE__ 0
  107. #endif
  108.  
  109. /* General assertion (NB: type command-period to dprintf to halt) */
  110. #define zassert(n) ((n) || dprintf("line %d: zassert(n) failed", __LINE__))
  111.  
  112. /* Check the validity of a buffer offset */
  113. #define zcheckpos(p) \
  114.     ((p)>=0 && (p)<=tp->buflen && ((p)<tp->gap || (p)>=zgapend) || \
  115.         dprintf("line %d: zcheckpos(p=%d) buf[%d] gap=%d+%d", \
  116.             __LINE__, p, tp->buflen, tp->gap, tp->gaplen))
  117.  
  118. /* Sanity checking routine for entire state */
  119. #define zcheck() techeck(tp, __LINE__)
  120.  
  121. #else /* NDEBUG */
  122.  
  123. #define zassert(n)    /*empty*/
  124. #define zcheckpos(pos)    /*empty*/
  125. #define zcheck()    /*empty*/
  126.  
  127. #endif /* NDEBUG */
  128.